package com.hz.framework.ajax;

import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;

/**
 * ajax DWR反推方法类
 * */
public class DWRShove {

	/**
	 * ajax DWR反推方法
	 * 传 request 对象
	 * 传一个包含 map 的 list
	 * map包含键值 valueList,functionName,htmlName
	 * valueList:对应值的list
	 * functionName:对应反推js方法名
	 * htmlName:对应反推到的页面名称
	 * */
	public void frontNewsList(List DWRList, HttpServletRequest request) {
		
		if(DWRList!=null && !DWRList.isEmpty()){
			for(Iterator iter = DWRList.iterator(); iter.hasNext();){
				
				Map map =(Map)iter.next();
				List valueList = (List)map.get("valueList"); //获得值的list
				String functionName = (String)map.get("functionName");//获得js方法名
				String htmlName = (String)map.get("htmlName");//获得页面名称
				
				ScriptBuffer sb = new ScriptBuffer();
				// 回调函数
				sb.appendScript(functionName+"(").appendData(valueList).appendScript(");");

				ServerContext sctx = ServerContextFactory.get(request.getSession().getServletContext());

				Collection<ScriptSession> sessions = new HashSet<ScriptSession>();
				
				sessions = sctx.getScriptSessionsByPage(htmlName); 
				
				//将数据推送到与服务器有连接的客户端
				for (ScriptSession session : sessions){ 
					
					session.addScript(sb); 
				}
			}
		}
	}
	/**
	 * 反推公用方法
	 * @param param 参数集合
	 * @param path  路经集合
	 * @param methodName 页面上要反推的方法名称
	 * @param request dwr自动传递request
	 * @return 是否成功
	 */
	public boolean pushUtil(List param,String[] path,String methodName,HttpServletRequest request)
	{
		ScriptBuffer sb = new ScriptBuffer() ; 

		//将所有的参数作为集合进行传递,前台接受时参数必须数组,无餐的时候传null
		sb.appendScript(methodName+"(");

		if(param != null && param.size() > 0)
		{
			sb.appendData(param) ;
		}

		sb.appendScript(");")  ;

		ServerContext sctx = ServerContextFactory.get(request.getSession().getServletContext()) ;
		
		if(sctx==null)
		{
			return false;
		}
		Collection<ScriptSession> sessions = new HashSet<ScriptSession>() ;

		//循环推出路径
		for(int i = 0 ; i < path.length ; i ++)
		{
			sessions = sctx.getScriptSessionsByPage(path[i]); 
			//将数据推送到与服务器有连接的客户端
			for(ScriptSession session : sessions)
			{ 
				session.addScript(sb); 
			}
		}

		return true ;
	}
}
